package com.example.demo.jucConcurrent.ConcurrentLinkedQueue详解;

import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * ConcurrentLinkedQueue详解
 * ConnCurrentLinkedQueue一个基于链接节点的无线安全队列,此队列按照FIFo(先进先出)原则对元素进行排序,
 * 对列的头部是对列中时间最长的元素,列队的尾部 是队列中时间最短的元素,新的元素插入到队列尾部,队列获取操作从队列头部获得元素,d
 * 当多个线程共享访问一个公共 Conllection时,ConcurrentLinkedQueue是一个切当的选择,次队列不允许使用Null元素,@Padai
 *
 *ConcurrenLinkQueu数据结构
 * 通过源码分析:ConcurrentLinkedQueue的数据结构与LinkedBlickingQueue的数据结构相同,都是使用链表结构,
 * ConcurrentLinkedQueue的数据结构如下
 * 说明:ConucrrentLinkedQueue采用链表结构,并包含有一个头结点和一个尾节点.
 */
public class ConcurrentLinkedQueueDemo {

    public static void main(String[] args) {
        ConcurrentLinkedQueue<Integer> clq = new ConcurrentLinkedQueue<>();
        PutThread putThread = new PutThread(clq);
        GetThread getThread = new GetThread(clq);
        putThread.start();
        getThread.start();
    }
}

class  PutThread extends  Thread{
    private ConcurrentLinkedQueue<Integer> clq;
    public PutThread(ConcurrentLinkedQueue<Integer> clq) {
        this.clq = clq;
    }

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            try {
                System.out.println("add"+i);
                clq.add(i);
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class  GetThread  extends  Thread{
    private  ConcurrentLinkedQueue<Integer> clq;

    public GetThread(ConcurrentLinkedQueue<Integer> clq) {
        this.clq = clq;
    }

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            try {
                System.out.println("poll"+clq.poll());
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}